import 'dart:io';

import 'package:audio_waveform/constant.dart';
import 'package:audio_waveforms/audio_waveforms.dart';
import 'package:file_picker/file_picker.dart';
import 'package:flutter/material.dart';

import 'chat_bubble.dart';

class Home extends StatefulWidget {
  const Home({Key? key}) : super(key: key);

  @override
  State<Home> createState() => _HomeState();
}

class _HomeState extends State<Home> {
  late final RecorderController recorderController;


  String? musicFile;
  bool isRecording = false;
  List<String> videoList = [];

  @override
  void initState() {
    super.initState();
    recorderController = RecorderController()
      ..androidEncoder = AndroidEncoder.aac
      ..androidOutputFormat = AndroidOutputFormat.mpeg4
      ..iosEncoder = IosEncoder.kAudioFormatMPEG4AAC
      ..sampleRate = 44100;

    for (var element in Constant.audioList) {
      String appPath = Constant.getAppDirectory(element);
      videoList.add(appPath);
    }
  }

  @override
  void dispose() {
    recorderController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: const Color(0xFF252331),
      appBar: AppBar(
        backgroundColor: const Color(0xFF252331),
        elevation: 1,
        centerTitle: true,
        shadowColor: Colors.grey,
        title: Row(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Image.asset('assets/images/logo.png', scale: 1.5),
            const SizedBox(width: 10),
            const Text('Simform'),
          ],
        ),
      ),
      body: Column(
        children: [
          const SizedBox(height: 20),
          Expanded(
            child: ListView.builder(
              itemCount: videoList.length,
              itemBuilder: (_, index) {
                return WaveBubble(
                  isSender: index.isOdd,
                  path: videoList[index],
                  width: MediaQuery.of(context).size.width / 2,
                  appDirectory: Constant.appDirectory,
                );
              },
            ),
          ),
          const SizedBox(height: 20),
          bottomInput(context),
        ],
      ),
    );
  }

  Widget bottomInput(BuildContext context) {
    return SafeArea(
      child: Row(
        children: [
          AnimatedSwitcher(
            duration: const Duration(milliseconds: 200),
            child: isRecording
                ? AudioWaveforms(
                    enableGesture: true,
                    size: Size(MediaQuery.of(context).size.width / 2, 50),
                    recorderController: recorderController,
                    waveStyle: const WaveStyle(
                      waveColor: Colors.white,
                      extendWaveform: true,
                      showMiddleLine: false,
                    ),
                    decoration: BoxDecoration(
                      borderRadius: BorderRadius.circular(12.0),
                      color: const Color(0xFF1E1B26),
                    ),
                    padding: const EdgeInsets.only(left: 18),
                    margin: const EdgeInsets.symmetric(horizontal: 15),
                  )
                : Container(
                    width: MediaQuery.of(context).size.width / 1.7,
                    height: 50,
                    decoration: BoxDecoration(
                      color: const Color(0xFF1E1B26),
                      borderRadius: BorderRadius.circular(12.0),
                    ),
                    padding: const EdgeInsets.only(left: 18),
                    margin: const EdgeInsets.symmetric(horizontal: 15),
                    child: TextField(
                      readOnly: true,
                      decoration: InputDecoration(
                        hintText: "Type Something...",
                        hintStyle: const TextStyle(color: Colors.white54),
                        contentPadding: const EdgeInsets.only(top: 16),
                        border: InputBorder.none,
                        suffixIcon: IconButton(
                          onPressed: _pickFile,
                          icon: Icon(Icons.adaptive.share),
                          color: Colors.white54,
                        ),
                      ),
                    ),
                  ),
          ),
          IconButton(
            onPressed: _refreshWave,
            icon: Icon(
              isRecording ? Icons.refresh : Icons.send,
              color: Colors.white,
            ),
          ),
          const SizedBox(width: 16),
          IconButton(
            onPressed: _startOrStopRecording,
            icon: Icon(isRecording ? Icons.stop : Icons.mic),
            color: Colors.white,
            iconSize: 28,
          ),
        ],
      ),
    );
  }

  void _startOrStopRecording() async {
    try {
      if (isRecording) {

        final path = await recorderController.stop(false);

        if (path != null) {
          debugPrint(path);
          debugPrint("Recorded file size: ${File(path).lengthSync()}");
          videoList.add(path);
        }
        recorderController.reset();
      }
      else {

        var dataTime = DateTime.now().microsecondsSinceEpoch;
        // m4a 格式通用(ios不支持mp3格式)  如果需要mp3直接改后缀即可
        var pathTemp = "${Constant.appDirectory.path}/$dataTime.m4a";
        //var pathTemp = "${Constant.appDirectory.path}/$dataTime.mp3";
        await recorderController.record(path: pathTemp);
      }
    } catch (e) {
      debugPrint(e.toString());
    } finally {
      setState(() {
        isRecording = !isRecording;
      });
    }
  }

  void _pickFile() async {
    FilePickerResult? result = await FilePicker.platform.pickFiles();
    if (result != null) {
      musicFile = result.files.single.path;
      setState(() {});
    } else {
      debugPrint("File not picked");
    }
  }

  void _refreshWave() {
    if (isRecording) recorderController.refresh();
  }
}
